package com.dongdongshop.service.impl;

import com.dongdongshop.api.GoodsServiceApi;
import com.dongdongshop.data.Result;
import com.dongdongshop.dto.ItemDTO;
import com.dongdongshop.service.CartService;
import com.dongdongshop.vo.CartDetailVO;
import com.dongdongshop.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private GoodsServiceApi goodsServiceApi;

    @Override
    public void addCart(String userId, Integer num, Long itemId) {
        //1.首先从redis中获取登录用户的购物车数据,根据userId查询
        List<CartVO> cartOldList = getCartVOListFromRedis(userId);
        //2.根据商品id查询商品数据
        Result<ItemDTO> result = goodsServiceApi.getItemById(itemId);
        if(result.getCode() != 0){
            //如果调用的结果是错误的,整个接口都是不对的,抛出个异常就行了
            throw new RuntimeException();
        }
        ItemDTO itemDTO = result.getData();
        //3.根据商品数据获取商家id
        String sellerId = itemDTO.getSellerId();
        //4.判断redis中的购物车是否有该商家的id
        CartVO vo = null;
        for (CartVO cartVO : cartOldList) {
            //为true,给vo赋值,为false说明没有;
            if (Objects.equals(cartVO.getSellerId(), sellerId)) {
                vo = cartVO;
                break;
            }
        }
        // 4.1如果没有,说明我们之前购物车没有该商家的商品,需要创建购物车对象,追加到list中,存到redis中
        if (vo == null) {
            vo = new CartVO();
            vo.setSellerId(sellerId);//存入商家id
            //创建明细列表
            List<CartDetailVO> cartDetailVOList = new ArrayList<>();
            //创建明细对象
            CartDetailVO detailVO = new CartDetailVO();
            detailVO.setGoodsId(itemDTO.getGoodsId());//spu id
            detailVO.setItemId(itemDTO.getId());//sku id
            detailVO.setNum(num);//数量
            detailVO.setPic_path(itemDTO.getImage());//图片
            detailVO.setPrice(itemDTO.getPrice());//单价
            detailVO.setSellerId(sellerId);//商家id
            detailVO.setTitle(itemDTO.getTitle());//商品名称
            detailVO.setTotalFee(new BigDecimal(detailVO.getPrice().doubleValue() * num));//总价 单价 * 数量
            cartDetailVOList.add(detailVO);//将明细放入明细列表中
            vo.setDetailList(cartDetailVOList);//将明细列表放入购物车中
            cartOldList.add(vo);//新添加的购物车放入老的购物车中

        } else {
            // 4.2如果有,我们之前的购物车买过该商家的商品,此时vo不是空的
            List<CartDetailVO> detailList = vo.getDetailList();
            CartDetailVO detailVO = null;
            for (CartDetailVO cartDetailVO : detailList) {
                //  4.2 判断有没有购买的商品  //如果没有
                if (Objects.equals(cartDetailVO.getItemId(), itemId)) {
                    detailVO = cartDetailVO;
                    break;
                }
            }
            ///说明没买过
            if (detailVO == null) {
                //新建追加进去
                detailVO = new CartDetailVO();
                detailVO.setGoodsId(itemDTO.getGoodsId());//spu id
                detailVO.setItemId(itemDTO.getId());//sku id
                detailVO.setNum(num);//数量
                detailVO.setPic_path(itemDTO.getImage());//图片
                detailVO.setPrice(itemDTO.getPrice());//单价
                detailVO.setSellerId(sellerId);//商家id
                detailVO.setTitle(itemDTO.getTitle());//商品名称
                detailVO.setTotalFee(new BigDecimal(detailVO.getPrice().doubleValue() * num));//总价 单价 * 数量
                //将购物车明细数据放入明细列表中
                detailList.add(detailVO);
            } else {
                //  4.2.2 如果买过这个商家的这个商品 数量 + num  总价=单价*数量
                detailVO.setNum(detailVO.getNum() + num);//修改总数量
                detailVO.setTotalFee(new BigDecimal(detailVO.getPrice().doubleValue() * detailVO.getNum()));//修改总价格
                //如果减完之后的数量小于,该商品删除num为0或者小于0 的时候,就需要将该商品移除
                if(detailVO.getNum() <= 0){
                    detailList.remove(detailVO);
                }
                //如果我们明细列表删除完,大小为0了,说明该商家也就不应该存在了
                if(detailList.size() == 0){
                    cartOldList.remove(vo);
                }
            }
        }
        //存入redis
        setCartVOListToRedis(userId, cartOldList);
    }

    @Override
    public List<CartVO> getCartVOListFromRedis(String userId) {
        List<CartVO> cartVOList = (List<CartVO>) redisTemplate.boundHashOps("cartList").get(userId);
        //防止空指针,new一个空的
        if (cartVOList == null) {
            cartVOList = new ArrayList<>();
        }
        return cartVOList;
    }

    public void setCartVOListToRedis(String userId, List<CartVO> cartOldList) {
        redisTemplate.boundHashOps("cartList").put(userId, cartOldList);
    }

    @Override
    public void deleteCart(String userId) {
        redisTemplate.boundHashOps("cartList").delete(userId);
    }
}
